1860D - Balanced String - CodeForces Solution


constructive algorithms dp greedy

Please click on ads to support us..

C++ Code:

#include <bits/stdc++.h>

using namespace std;

const int INF = 1e8 + 69;

int main() {
  string s; cin >> s;
  int n = s.size(), zero = 0, one = 0;
  for (char &c : s) c == '0' ? ++zero : ++one; 
  int bound = zero * one, dim = bound << 1 | 1;
  vector DP(one + 1, vector(dim, INF));
  for (int i = 0; i <= zero; ++i) {
    vector newDP(one + 1, vector(dim, INF));
    for (int j = 0; j <= one; ++j) {
      if (!i and !j) {
        newDP[j][bound] = 0;
        continue;
      }
      int c = s[i + j - 1] - '0';
      for (int k = 0; k <= dim; ++k) {
        if (i and k + one - j <= dim) newDP[j][k] = min(newDP[j][k], DP[j][k + one - j] + c);
        if (j and k - zero + i >= 0) newDP[j][k] = min(newDP[j][k], newDP[j - 1][k - zero + i] + !c);
      }
    }
    DP.swap(newDP);
  }
  cout << DP[one][bound] / 2 << '\n';
  return 0;
}


Comments

Submit
0 Comments
More Questions

553A - Kyoya and Colored Balls
1364A - XXXXX
1499B - Binary Removals
1569C - Jury Meeting
108A - Palindromic Times
46A - Ball Game
114A - Cifera
776A - A Serial Killer
25B - Phone numbers
1633C - Kill the Monster
1611A - Make Even
1030B - Vasya and Cornfield
1631A - Min Max Swap
1296B - Food Buying
133A - HQ9+
1650D - Twist the Permutation
1209A - Paint the Numbers
1234A - Equalize Prices Again
1613A - Long Comparison
1624B - Make AP
660B - Seating On Bus
405A - Gravity Flip
499B - Lecture
709A - Juicer
1358C - Celex Update
1466B - Last minute enhancements
450B - Jzzhu and Sequences
1582C - Grandma Capa Knits a Scarf
492A - Vanya and Cubes
217A - Ice Skating